文章目录
  1. 1. java编译过程
  2. 2. 自定义HelloWorld注解处理器
    1. 2.1 定义一个注解
    2. 2.2 定义一个处理器
    3. 2.3 注册处理器服务
    4. 2.4 测试注解
    5. 2.5 查看效果
  3. 3. 参考

[TOC]

1. java编译过程

在搞清楚Lombok的原理之前, 首先看下java编译的基本过程。如图是OpenJDK提供的过程图, 大致分为三个步骤:

  1. Parse and Enter
    编译器会将java文件解析成Abstract Syntax Tree (AST),即抽象语法树,这个过程会校验语法的正确性等等。

  2. Annotation Processing
    在这个过程中自定义的注解处理器将会被调用,在这个过程中你可以对语法树进行校验(如checkstyle所做的),你也可以生成新的java文件等等。

  3. Analyse and Generate
    最后一步编译器就会根据抽象语法树生成对应的字节码(class文件)。

2. 自定义HelloWorld注解处理器

这样看来我们要想实现类似lombok的功能,看起来就好像很简单,那就是在完成上述的第二部操作

所有代码可以参考:https://github.com/IceMimosa/apt

2.1 定义一个注解

1
2
3
4
5
6
7
8
9
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface TestAnnotation {
/**
* 测试名称
*/
String name();
}

2.2 定义一个处理器

定义一个处理器, 继承AbstractProcessor类。

1
2
3
4
5
6
7
8
9
10
11
12
13
@SupportedAnnotationTypes({"io.patamon.apt.annotation.TestAnnotation"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class TestProcessor extends AbstractProcessor {

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement element : annotations) {
this.processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "HelloWorld, " + element.getSimpleName());
System.out.println("HelloWorld, " + element.getSimpleName());
}
return false;
}
}

2.3 注册处理器服务

在resources目录下新建目录META-INF/services,新建文件javax.annotation.processing.Processor,内容如下:

1
io.patamon.apt.processor.TestProcessor

2.4 测试注解

注意:测试的类不要和注解处理在同一个模块(或jar包),不然编译的时候会报类找不到的错误。

1
2
3
4
@TestAnnotation(name = "TestAnnotationName")
public class TestAnnotationDemo {

}

2.5 查看效果

1、 如果是在IDEA中测试,需要打开注解编译,位置: Preferences > Build, Execition, Deployment > compiler > Annotation Processors

或者pom.xml中添加build配置,IDEA会自动打开和关闭,详细可以参考代码。

1
2
3
4
5
6
7
8
9
 <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-proc:none</compilerArgument>
</configuration>
</plugin>

此时我们点击build > Rebuild Project,会在IDEA的message控制台看到如下信息:

2、 在控制台执行mvn clean package -DskipTests

需要在pom的build中添加tools.jar的配置

1
2
3
4
5
6
7
8
9
10
11
12
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/jre/lib/jce.jar:${JAVA_HOME}/lib/tools.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>

3. 参考

文章目录
  1. 1. java编译过程
  2. 2. 自定义HelloWorld注解处理器
    1. 2.1 定义一个注解
    2. 2.2 定义一个处理器
    3. 2.3 注册处理器服务
    4. 2.4 测试注解
    5. 2.5 查看效果
  3. 3. 参考